package com.baseframe.oss.template;

import com.baseframe.oss.entity.Oss;
import com.baseframe.oss.entity.OssFile;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.region.Region;


import java.io.InputStream;

/**
 * 腾讯oss
 */
public class TencentCosTemplate extends AbstractOssTemplate{

    private  COSClient cosClient;

    public TencentCosTemplate(Oss oss) {
        super(oss);
        init();
    }

    private void init(){
        COSCredentials credentials = new BasicCOSCredentials(getOss().getAccessKey(), getOss().getSecretKey());
        // 2 设置 bucket 的地域
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分
        Region region = new Region(getOss().getRegion()); //COS_REGION 参数：配置成存储桶 bucket 的实际地域，例如 ap-beijing，更多 COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        ClientConfig clientConfig = new ClientConfig(region);
        // 设置OSSClient允许打开的最大HTTP连接数，默认为1024个。
        clientConfig.setMaxConnectionsCount(1024);
        // 设置Socket层传输数据的超时时间，默认为50000毫秒。
        clientConfig.setSocketTimeout(50000);
        // 设置建立连接的超时时间，默认为50000毫秒。
        clientConfig.setConnectionTimeout(50000);
        // 设置从连接池中获取连接的超时时间（单位：毫秒），默认不超时。
        clientConfig.setConnectionRequestTimeout(1000);
        // 3 生成 cos 客户端
        cosClient = new COSClient(credentials, clientConfig);

    }

    @Override
    public OssFile putFile(String originalName, InputStream inputStream) {

        String fileName = getFileName(originalName);
        //获取文件大小
        int fileSize = getFileSize(inputStream);
        //获取文件以为标识
        String fileKey = getFileKey(fileName);
        //封装文件名
        cosClient.putObject(getCosBucketName(),fileKey,inputStream,null);

        //封装文件对象
        OssFile ossFile = new OssFile();

        ossFile.setOriginalFilename(originalName);
        ossFile.setFilename(fileName);
        ossFile.setLink(getFileLink(fileKey));
        ossFile.setSize(String.valueOf(fileSize));
        ossFile.setKey(getFileKey(fileName));



        return ossFile;
    }

    @Override
    public boolean DeleteFile(String fileName) {

        try {

            cosClient.deleteObject(getCosBucketName(),getFileKey(fileName));
            return true;
        }catch (Exception e){
            return false;
        }

    }

    @Override
    public String getFileLink(String fileKey) {
        String host = "https://" + cosClient.getClientConfig().getEndpointBuilder().buildGeneralApiEndpoint(getCosBucketName());
        return host.concat("/").concat(fileKey);
    }

    private String getCosBucketName(){
        return getOss().getBucketName().concat("-").concat(getOss().getAppId());
    }
}
